package com.springbootee.Config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @name: RedisConfig 配置类
 * @author: 你的辰宝
 * @time: 2021/11/3 18:42
 * @deprecated :  注释
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {


        /**
          *@deprecated: RedisConfig
          *@parms: * @Param factory:
          *@return: * @return: org.springframework.data.redis.core.RedisTemplate<java.lang.String,java.lang.Object>
          *@author: 你的辰宝
          *@time: 2021/11/3 18:46
         * RedisTemplate相关配置
         */
        @Bean
        public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
            RedisTemplate<String,Object> template=new RedisTemplate<>();
            //配置连接工厂
            template.setConnectionFactory(factory);
            //序列化redis的value值(默认使用JDK序列化方式)
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om =new ObjectMapper();
            //指定要序列化的域，field,get和set,以及修饰符范围，ANY是都有的
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            //指定序列化输入的类型，类必须是非final修饰的，，final修饰的类
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            //值采用Json序列化
            template.setValueSerializer(jackson2JsonRedisSerializer);

            //使用StringRedisSerializer来序列化和反序列化redis的值
            template.setKeySerializer(new StringRedisSerializer());
            //设置 hash key 和 value的序列化模式
            template.setHashKeySerializer(new StringRedisSerializer());
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            template.afterPropertiesSet();
            return template;
        }
}
